iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
生成式 AI

練習AI系列 第 15

AI 對話任務設計(多輪對話流程、決策樹、狀態管理)

  • 分享至 

  • xImage
  •  

🆕 程式碼

  1. src/day14_conversation.js
    // src/day14_conversation.js
    import { openai } from "./aiClient.js";

// 簡易記憶體:用 Map 存會話
const sessions = new Map();

/** 初始化 session 狀態 */
function getSession(sessionId = "default") {
if (!sessions.has(sessionId)) {
sessions.set(sessionId, { history: [], state: {} });
}
return sessions.get(sessionId);
}

/**

  • 多輪對話核心
  • @param {string} userInput 使用者輸入
  • @param {object} opts
  • @param {string} opts.sessionId
  • @returns {Promise<{reply:string, state:object}>}
    */
    export async function dialogue(userInput, { sessionId = "default" } = {}) {
    const session = getSession(sessionId);

// 簡單決策樹:根據 state 與輸入決定下一步
let systemPrompt = 你是一個互動式助理,負責蒐集資訊並引導使用者。 目前任務:協助使用者建立「報修單」。 必要資訊:姓名(name)、電話(phone)、地址(address)、問題描述(symptom)。 請逐步提問,一次只問缺少的欄位。 若全部齊全,請確認資訊並輸出 JSON。;

const messages = [
{ role: "system", content: systemPrompt },
...session.history,
{ role: "user", content: userInput },
];

const res = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages,
temperature: 0.4,
});

const reply = res.choices?.[0]?.message?.content?.trim() || "(無回覆)";
session.history.push({ role: "user", content: userInput });
session.history.push({ role: "assistant", content: reply });

return { reply, state: session.state };
}

/** 重置 session */
export function resetDialogue(sessionId = "default") {
sessions.delete(sessionId);
}

  1. index.js(新增分支)
    import { dialogue, resetDialogue } from "./src/day14_conversation.js";

// ...既有 args 解析略

async function main() {
const task = args.task || "chat";

if (task === "dialogue") {
const sessionId = args.session || "default";
if (args.reset) {
resetDialogue(sessionId);
console.log(已重置對話 session=${sessionId});
return;
}
const input = args.text || "嗨";
const { reply } = await dialogue(input, { sessionId });
console.log(\n[${sessionId}] AI:${reply}\n);

} else {
// ...你既有的其他分支
}
}

  1. package.json(新增 scripts)
    {
    "scripts": {
    "day14:dialogue:start": "node index.js --task dialogue --session demo --text '哈囉'",
    "day14:dialogue:next": "node index.js --task dialogue --session demo --text '我叫小明'",
    "day14:dialogue:reset": "node index.js --task dialogue --session demo --reset true"
    }
    }

▶️ CLI 使用

開始一個新對話

npm run day14:dialogue:start --silent

繼續回答

npm run day14:dialogue:next --silent

重置 session

npm run day14:dialogue:reset --silent

AI 會依缺少的欄位一步步問你,直到蒐集完整資訊,最後輸出 JSON 報修單。


上一篇
AI 程式碼助理(解釋/重構/風險評審/單元測試草稿)
下一篇
可插拔對話流程引擎(Workflow Engine for Dialogues)
系列文
練習AI16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言